package cn.hp.customer.service.impl;

import cn.hp.customer.mapper.CustomerMapper;
import cn.hp.customer.mapper.SmsMapper;
import cn.hp.customer.mapper.SmsTemplateMapper;
import cn.hp.customer.pojo.Customer;
import cn.hp.customer.pojo.Customer1;
import cn.hp.customer.pojo.Sms;
import cn.hp.customer.pojo.SmsTemplate;
import cn.hp.customer.service.CustomerService;
import cn.hp.customer.util.JedisUtil;
import cn.hp.customer.util.ResponseData;
import cn.hp.customer.util.SMSTemplateConstant;
import cn.hp.customer.util.SmsUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.util.Date;
import java.util.HashMap;
import java.util.List;

// 客户业务实现类
@Service
//@Transactional
public class CustomerServiceImpl implements CustomerService {

    @Autowired
    private SmsMapper smsMapper ;

    @Autowired
    private SmsTemplateMapper smsTemplateMapper ;

    @Autowired
    private CustomerMapper customerMapper ;

    // 成员变量  对象创建的时候进行赋值  单例
    private HashMap<String, Object> smsTemplateCache = new HashMap<>();

    // 业务层 依赖于 mapper持久层
    //  1.用户录入手机号获取到手机短信验证码，涉及阿里云短信工具类，随机生成6位验证码  将短信验证码保存在缓存中(redis)，设置过期时间

    // 发送短信服务  依赖于阿里云短信的业务 SmsService  SmsUtil
//    @Override
//    public String smsSending(String phoneNumber) {
//        // 生成验证码
//        String verificationCode = RandomStringUtils.randomNumeric(6);
//        // 使用固定的工具类发送 传入 短信模板号 (固定的几个、添加到数据库中 )
//        // 发短信的时候从数据库中查询，这个模板是否存在   使用缓存进行访问
//        boolean sendFlag = SmsUtil.sendSms(phoneNumber, verificationCode);
//        if (sendFlag){
//            return verificationCode ;
//        }
//        return null;
//    }

    // 1.生成随机的验证码  2.编写短信模板(将短信模板缓存到内存中，查询这个模板是否在缓存中，)   3.进行短信的发送  4.记录发送的短信
        @Override
    public String smsSending(String phoneNumber) {
        // 生成验证码
        String verificationCode = RandomStringUtils.randomNumeric(6);
        // 编写短信模板       短信模板缓存到内存中，查询这个模板是否在缓存中
        if (!smsTemplateCache.containsKey(SMSTemplateConstant.REGISTER_TEMPLATE_ID)){
            // 去数据库中查询这个短信模板 然后加载到 缓存中
            SmsTemplate smsTemplate = smsTemplateMapper.selectSmsByTemplateId(SMSTemplateConstant.REGISTER_TEMPLATE_ID);
            smsTemplateCache.put(SMSTemplateConstant.REGISTER_TEMPLATE_ID , smsTemplate);
        }
        //  短信记录的相关信息
            Sms sms = new Sms() ;
            sms.setPassengerPhoneNumber(phoneNumber);
            sms.setSendTime(new Date());
        try {
            // 发送短信
//            boolean sendFlag = SmsUtil.sendSms(phoneNumber, ((SmsTemplate)smsTemplateCache.get(SMSTemplateConstant.REGISTER_TEMPLATE_ID)).getTemplateId(), verificationCode);
            // 省钱测试
            boolean sendFlag = true ;
            // 进行短信记录的录入
            String content = ((SmsTemplate)smsTemplateCache.get(SMSTemplateConstant.REGISTER_TEMPLATE_ID)).getContent();
            String replace = StringUtils.replace(content, "${code}", verificationCode);
            sms.setSmsContent(replace);
            sms.setSendFlag(1);
            sms.setSendNumber(0);
            if (sendFlag){
                return verificationCode ;
            }
        }catch (RuntimeException e){
            // 发送短信失败的情况
            sms.setSmsContent("");
            sms.setSendFlag(0);
            sms.setSendNumber(1);
        }finally {
            // 将发送的短信相关数据保存
            smsMapper.insert(sms);
        }
        return null;
    }
    // 缓存验证码
    @Override
    public ResponseData cacheVerificationCode(String phoneNumber, String code) {
        //1.判断验证码 格式是否正确
        if (code != null && code.length() == 6 ){
            // 缓存 使用jedis进行缓存
            Jedis jedis = JedisUtil.getJedis();
            // 缓存 验证码 5分钟
            jedis.setex(phoneNumber , 300 , code );
            // 缓存登录时间 、 1小时内容操作  1分钟内的操作  次数
//            jedis.set(phoneNumber+"_loginTime" ,new Date().getTime()+"");
            // 非连续相同  生成的时候添加
            if (jedis.get(phoneNumber+"_oneHour") == null || jedis.get(phoneNumber+"_oneHour").equals("")){
//                jedis.setex(phoneNumber+"_oneHour3" ,600 , "1" );
//                jedis.setex(phoneNumber+"_oneHour5" ,3600 , "1" );
                jedis.setex(phoneNumber+"_oneHour" ,3600 , "1" );

            }else{
                jedis.setex(phoneNumber+"_oneHour" ,3600 ,(Integer.parseInt(jedis.get(phoneNumber+"_oneHour")) + 1)+"" );
            }
            // 连续相同 登录的时候校验
            // jedis.setex(phoneNumber+"_oneMin" , 60 , (Integer.parseInt(jedis.get(phoneNumber+"_oneMin")) + 1)+"");
            return ResponseData.success();
        }
        return ResponseData.fail("验证码发送失败，请重试！");
    }

    @Override
    public ResponseData login(String phoneNumber, String code) {
        // 1.  验证是否在黑名单中 ( 1.对相同验证码进行黑名单生成 )
        Jedis jedis = JedisUtil.getJedis();
        // 设置1分钟内使用验证码登录的次数
        String oneMin = jedis.get(phoneNumber + "_oneMin");
        if ( oneMin == null || oneMin.equals("")){
            jedis.setex(phoneNumber + "_oneMin" , 60 ,"1");
        }else { // 存在之前登录的过的操作
            jedis.setex(phoneNumber + "_oneMin",60, Integer.parseInt(oneMin)+1+"" );
        }
        oneMin = jedis.get(phoneNumber + "_oneMin");
        // 判断是否存在1分钟黑名单
        if (Integer.parseInt(oneMin) > 3 ){
            return ResponseData.fail("您同一个错误验证码点击登录的次数过多,请 1 分钟后再重试");
        }

        // 判断是否在10分钟限制
        String oneHour = jedis.get(phoneNumber + "_oneHour");
        if ( oneHour != null && Integer.parseInt(oneHour) > 3){
            return ResponseData.fail("您登录失败的次数过多,请 10 分钟后再重试");
        }

        // 2.  验证码账号密码是否正确
        if (code.equals(jedis.get(phoneNumber))){
            // 验证码正确 ，则清空所有的相关缓存数据
            jedis.del(phoneNumber);
            jedis.del(phoneNumber+"_oneMin");
            jedis.del(phoneNumber+"_oneHour");
            // 添加登录用户的数据库验证( 为了让未注册的用户，注册登录 )  登录注册
            // 1. 先查询是否存在该用户  2.不存在进行创建  3.下一步
            int count = customerMapper.selectCustomerCount(phoneNumber);
            if ( count < 1 ){
                customerMapper.insert(phoneNumber);
            }
           return ResponseData.success();
        }
        return ResponseData.fail("验证码输入不正确");
    }

//    @Override
//    public ResponseData findAll() {
//            // 查询用户的全部信息方法
//        List<Customer> customers = customerMapper.findAll();
//        return ResponseData.success(customers);
//    }

    @Override
    public ResponseData findAllByPage(int page, int limit , String phoneNumber) {
            // 分页查询方法
        // 开启分页 两个参数  1从第几页开始  2.展示几条  后一行必须跟查询语句
        PageHelper.startPage(page , limit);
        // 执行查询语句
        List<Customer> customers = customerMapper.findAll(phoneNumber);
        PageInfo pageInfo = new PageInfo<>(customers);
        return ResponseData.success(pageInfo);
    }

    @Override
    public ResponseData deleteCustomer(int id) {
        int count = customerMapper.deleteOneById(id);
        if (count > 0 ){
            return ResponseData.success();
        }
        return ResponseData.fail("删除失败，请重新操作!");
    }

    @Override
    public ResponseData updateShow(int id) {
        Customer customer = customerMapper.selectOneById(id);
        return ResponseData.success(customer);
    }

    @Override
    public ResponseData update(Customer1 customer) {
//            if (customer.getGender().equals("男")){
//                customer.setGender("1");
//            }else {
//                customer.setGender("0");
//            }
            int count = customerMapper.update(customer);
            if ( count == 1) {
                return ResponseData.success();
            }
        return ResponseData.fail("修改失败");
    }

    @Override
    public List<Customer> findAllByRegisterTime(String s) {
        return customerMapper.findAllByTime(s);
    }
}
